进程自动化监控

进程监控

日常程序运行中,有很多意外情况导致程序中断,想要及时监测到程序是否正常运行则需要通过一些手段来实现, 比如在程序中添加一些监控提示,但是如果对原始程序修改不方便,则可以通过外部监控的方式进行.

本文主要介绍使用python对程序的进程进行监控,如果进程中断,则发出预警.

监控进程的方式有很多种,

psutil

psutil可以获取进程的很多信息, 我们可以通过这个库统计进程进行相应的判断

例如, 下面代码片段是通过获取电脑中的所有进程并且和需要监控的进程进行对比.

monitor_list = {'datagrip', 'bash}  # 指定需要监控的服务进程列表

while True
    proc_name = set()  # 系统检测的进程名
    for proc in psuitl.process_iter(attrs=['name]):
        proc_name.add(proc.info['name])
    proc_stop = monitor_list - proc_name  # 统计指定服务进程列表中没有启动的进程
    if proc_stop:
        # TODO
        # 如果监控到进程停掉之后,可以在这边进行相关的操作,比如通过微信或者钉钉等程序发出警报信息, 同样也可以重启某个进程
    time.sleep(5)  #每隔5秒执行一次

下面是一个通过进程监控,监控到进程停止之后通过钉钉机器人进行监控报警

import psutil
import requests
import time
import json

monitor_name_set = {'datagrip', 'zsh'}  # 创建用户指定监控的服务进程名称

# 钉钉机器人的token
dingding_url = 'https://oapi.dingtalk.com/robot/send?access_token=5077e77b6059f15efe28a6611c430c16762b07c37627c7b5bc81e758a34ee835'

while True:
    proc_dict = {}
    proc_name = set()  # 系统检测的进程名称

    for proc in psutil.process_iter(attrs=['pid', 'name']):
        proc_dict[proc.info['pid']] = proc.info['name']
        proc_name.add(proc.info['name'])

    proc_stop = monitor_name_set - proc_name

    if proc_stop:  # 如果确实有监控的进程停掉了,发出告警
        for p in proc_stop:
            p_status = '停止'
            p_name = p
            data = {
                "msgtype": "markdown",
                "markdown": {
                    "title": "监控信息",
                    "text": "### %s\n" % time.strftime("%Y-%m-%d %X") +
                    "> #### 服务名:%s \n\n" % p_name +
                    "> #### 状态:%s \n\n" % p_status +
                    "> #### 请尝试启动"
                },
            }
            headers = {'Content-Type': 'application/json;charset=UTF-8'}
            send_data = json.dumps(data).encode('utf-8')
            requests.post(url=dingding_url, data=send_data, headers=headers)

    time.sleep(5)

commands

通过commands查询所需要监控的进程数,进程数小于0,则做相应的预警操作

status,output = commands.getstatusoutput("jps -m  |grep 'com.static.app.Main'|wc -l")

print(output)
if (output == '0'):
    # TODO
    # 进程不存在,进行相应的操作

这种操作可以结合crontab,创建定时任务,如果进程不存在则重启进程

完整示例

import commands
import os
import sys
import logging

def monitor_process():
  status,output = commands.getstatusoutput("jps -m  |grep 'com.static.app.Main'|wc -l")

  if (output == '0'):
    # 执行指定的命令
    os.system("sh /server/statics/start.sh")
if __name__ == '__main__':
    monitor_process()

crontab命令, 每五分钟执行一次

*/5 * * * * source /etc/profile && cd /server/statics/ && python /server/statics/defend.py

参考文献

Python实现对服务进程的监控,告警给钉钉机器人及重启任务

使用python 自动化监控进程